{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exploration vs Exploitation\n",
    "\n",
    "In this notebook we will look at the exploration vs exploitation dilemma. We will consider a simpler environment known as **Mulit Arm Bandit**.\n",
    "\n",
    "We will implement three variations of exploration strategy and compare their relative performance. \n",
    "\n",
    "Our Bandit has $K$ actions. Each action has a probability of success $\\theta_k$ which is **unknown** to us. When you pull the kth arm, it produces a reward $r$ of 1 with probability $\\theta_k$ and reward $r$ of 0 with probability $1-\\theta_k$.\n",
    "\n",
    "Let the optimal action be defined as the one which has maximum probability of success i.e. $\\theta_k$.\n",
    "\n",
    "$\\theta^* = \\max_k\\{\\theta_k\\}$\n",
    "\n",
    "The regret at a time step t is defined as $\\theta^* - r_t$\n",
    "\n",
    "The total regret for a fixed time horizon T is defined as:\n",
    "$$\\rho = T . \\theta^* - \\sum_{t=1}^T r_t$$\n",
    "\n",
    "We will use three different exploration strategies and see how total regret grows as a function of T."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bandit Environment\n",
    "`Bandit` implements the environment. We are using non contextual multi arm bandit. In other words the environment has no state, we take an action and observe the reward and the episode terminates. In next time step, we choose another action as per our exploration strategy to get another reward followed by episode termination. This cycle goes on for T time steps. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Bandit:\n",
    "    def __init__(self, n_actions=5):\n",
    "        self._probs = np.random.random(n_actions)\n",
    "        self.n_actions = n_actions\n",
    "\n",
    "    def pull(self, action):\n",
    "        if np.random.random() > self._probs[action]:\n",
    "            return 0\n",
    "        return 1\n",
    "\n",
    "    def optimal_reward(self):\n",
    "        return np.max(self._probs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Random Sampling Agent\n",
    "\n",
    "In this the agent randomly chooses an action from available actions and records the regret. There is no exploitation. Only random exploration. We know that it will behave very badly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class RandomAgent:\n",
    "    def __init__(self, n_actions=5):\n",
    "        self.success_cnt = np.zeros(n_actions)\n",
    "        self.failure_cnt = np.zeros(n_actions)\n",
    "        self.total_pulls = 0\n",
    "        self.n_actions = n_actions\n",
    "        \n",
    "    def reset(self):\n",
    "        self.success_cnt = np.zeros(n_actions)\n",
    "        self.failure_cnt = np.zeros(n_actions)\n",
    "        self.total_pulls = 0        \n",
    "        \n",
    "    def get_action(self):\n",
    "        return np.random.randint(0, self.n_actions)\n",
    "    \n",
    "    def update(self, action, reward):\n",
    "        self.total_pulls += 1\n",
    "        if reward == 1:\n",
    "            self.success_cnt[action] += 1\n",
    "        else:\n",
    "            self.failure_cnt[action] += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Epsilon Greedy Sampling Agent\n",
    "\n",
    "This is similar to the $\\epsilon$-greedy strategy we have seen in all previous chapters. The agent tries different actions and forms an estimate $\\{\\hat{\\theta}_k\\}$ of the unknown actual success probabilities $\\{\\theta_k\\}$ of `Bandit` environment. It takes the action with  $\\hat{\\theta}^* = \\max_k\\{\\hat{\\theta}_k\\}$ with $1-\\epsilon$ probability(exploit) and takes a random action with probability $\\epsilon$ (explore)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class EGreedyAgent(RandomAgent):\n",
    "    def __init__(self, n_actions=5, epsilon=0.01):\n",
    "        super().__init__(n_actions)\n",
    "        self.epsilon = epsilon\n",
    "    \n",
    "    def get_action(self):\n",
    "        estimates = self.success_cnt / (self.success_cnt+self.failure_cnt+1e-12)\n",
    "        if np.random.random() < self.epsilon:\n",
    "            return np.random.randint(0, self.n_actions)\n",
    "        else:\n",
    "            return np.argmax(estimates)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### UCB1 Sampling Agent\n",
    "The agent tries different actions and records the number of successes ($\\alpha_k$) and failures ($\\beta_k$). \n",
    "\n",
    "It calculates the estimates of success probabilities:\n",
    "$$exploit = \\hat{\\theta}_k = \\frac{\\alpha_k}{\\alpha_k + \\beta_k}$$ \n",
    "\n",
    "It also calculates the exploration which favors the less visited actions more:\n",
    "$$explore = \\sqrt{\\frac{2.\\log{t}}{\\alpha_k + \\beta_k}} $$\n",
    "\n",
    "The agent then picks the action with maximum of explore + exploit score: \n",
    "$$score = \\frac{\\alpha_k}{\\alpha_k + \\beta_k} + \\lambda\\sqrt{\\frac{2.\\log{t}}{\\alpha_k + \\beta_k}} $$ \n",
    "where $\\lambda$ controls the relative importance of explore vs exploit. We will use $\\lambda=1$ in our code."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class UCBAgent(RandomAgent):\n",
    "    def get_action(self):\n",
    "        exploit = self.success_cnt / (self.success_cnt+self.failure_cnt+1e-12)\n",
    "        explore = np.sqrt(2*np.log(np.maximum(self.total_pulls,1))/(self.success_cnt+self.failure_cnt+1e-12))\n",
    "        estimates =  exploit + explore\n",
    "        return np.argmax(estimates)        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Thompson Sampling Agent\n",
    "\n",
    "This is based on Bayesian Approach. We start with an agent which has uniform probability (prior) which is reflected with a prior beta distribution of $Beta(\\alpha=1, \\beta=1)$. The agent then samples the actions using this distribution. And then it picks the action with maximum $\\hat{\\theta}_k$\n",
    "\n",
    "As the success and failure counts are updated in each step, the agent updates it belief of the $\\hat{\\theta}_k$:\n",
    "\n",
    "$\\hat{\\theta}_k \\sim Beta(\\alpha=\\alpha_k+1, \\beta=\\beta_k+1)$ \n",
    "\n",
    "It uses the updated $Beta$ distribution to sample and pick the action with maximum $\\hat{\\theta}_k$. And the cycle goes on\n",
    "\n",
    "It is basically picking up actions based on the samples of the belief of which action has the what chance of being best."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ThompsonAgent(RandomAgent):\n",
    "    def get_action(self):\n",
    "        estimates = np.random.beta(self.success_cnt+1, self.failure_cnt+1)\n",
    "        return np.argmax(estimates)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Playout\n",
    "`get_regret` calculates the total regret for a given agent and an environment with fixed $\\theta_k$'s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_regret(env, agent, n_steps=10000, n_trials=10):\n",
    "    score = np.zeros(n_steps)\n",
    "    optimal_r = env.optimal_reward()\n",
    "\n",
    "    for trial in range(n_trials):\n",
    "        agent.reset()\n",
    "        for t in range(n_steps):\n",
    "            action = agent.get_action()\n",
    "            reward = env.pull(action)\n",
    "            agent.update(action, reward)\n",
    "            score[t] += optimal_r - reward\n",
    "    score = score / n_trials\n",
    "    score = np.cumsum(score)\n",
    "    return score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot\n",
    "We plot the total regret curve for all the three exploration strategies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_regret(scores):\n",
    "    for k,v in scores.items():\n",
    "        plt.plot(v)\n",
    "    plt.legend([k for k,v in scores.items()])\n",
    "    plt.ylabel(\"regret\")\n",
    "    plt.xlabel(\"steps\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Everything put together"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_actions = 5\n",
    "n_steps=10000\n",
    "n_trials=50\n",
    "epsilon = 0.01\n",
    "\n",
    "agents = {\n",
    "    #\"Random\" : RandomAgent(n_actions), \n",
    "    \"EpsilonGreedy(eps=0.01)\" : EGreedyAgent(n_actions, epsilon),\n",
    "    \"UCB\": UCBAgent(n_actions),\n",
    "    \"Thompson\": ThompsonAgent(n_actions) }\n",
    "\n",
    "env = Bandit(n_actions)\n",
    "scores = {}\n",
    "\n",
    "for name, agent in agents.items():\n",
    "    score = get_regret(env, agent, n_steps, n_trials)\n",
    "    scores[name] = score\n",
    "\n",
    "plot_regret(scores)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
